package LimitedTimeGame.Day_0218;

/**
 * @author zxc
 * @date 2023/02/18 10:36
 **/

/**
 * 题目 ：某个颜色的相邻两个颜色均是相同的，则选择删除该颜色;
 * 题目详述 ：
 * 总共有 n个颜色片段排成一列，每个颜色片段要么是'A'要么是'B'。
 * 给你一个长度为n的字符串colors，其中colors[i]表示第i个颜色片段的颜色。
 *
 * Alice 和 Bob 在玩一个游戏，他们 轮流从这个字符串中删除颜色。Alice 先手。
 * （1）如果一个颜色片段为 'A'且 相邻两个颜色都是颜色 'A'，那么 Alice 可以删除该颜色片段。
 * （2）Alice不可以删除任何颜色'B'片段。
 * （3）如果一个颜色片段为 'B'且 相邻两个颜色都是颜色 'B'，那么 Bob 可以删除该颜色片段。
 * （4）Bob 不可以删除任何颜色 'A'片段。
 * （5）Alice 和 Bob 不能从字符串两端删除颜色片段。
 * （6）如果其中一人无法继续操作，则该玩家 输掉游戏且另一玩家 获胜。
 * 假设 Alice 和 Bob 都采用最优策略，如果 Alice 获胜，请返回true，否则 Bob 获胜，返回false。
 *
 * 提示：
 * 1 <= colors.length <= 105
 * colors 只包含字母 'A' 和 'B'
 *
 */
public class WinnerOfGame {
    /**
     * 思路 ：
     * 由于必须要找到三个及以上相同颜色的连续串,才能够实现将其删除，若是找到小于三个相同颜色的连续串，那也是没用的;
     * 由于其是被另一种颜色所包围，所以就算进行删除之后，其也是无效的连续串;
     * ===>
     * 即，只需要去寻找各自颜色连续串的总数;
     * @param colors
     * @return
     */
    public boolean winnerOfGame(String colors) {
        // 统计Alice和Bob的所有各自颜色连续串的总数;
        int AliceCount = 0;
        int BobCount = 0;
        // 记录Alice和Bob某个连续颜色串的长度;
        int countA = 0;
        int countB = 0;
        // 作为遍历字符串colors的指针，指针取值范围[0,len - 1];
        int index = 0;
        int len = colors.length();
        // 遍历所有字符串
        while(index < len){
            // 由于字符串color中只包含字母'A'/'B';
            // 遍历一段连续的'A'/'B'字符串;
            while(index < len && colors.charAt(index) == 'A'){
                index++;
                countA++;
            }
            if(countA >= 3){
                AliceCount += countA - 2;
            }
            countA = 0;

            while(index < len && colors.charAt(index) == 'B'){
                index++;
                countB++;
            }
            if(countB >= 3){
                BobCount += countB - 2;
            }
            countB = 0;
        }
        return AliceCount > BobCount;
    }
    /**
     * 分析 ：
     * （1）时间复杂度 ：由于只需要对于colors字符串进行一次遍历即可,即O(n);
     * （2）空间复杂度 ：未使用到任何的额外空间，即O(1);
     */
}
